#include "stream_gst_init.h"
#include <gst/gst.h>
#include "utils_log.h"

namespace El {
namespace StreamService {

StreamGst &StreamGst::GetInstance()
{
    static StreamGst instance;
    return instance;
}

bool StreamGst::Start()
{
    if (isInitialized_) {
        EL_INFO("gst already initialized");
        return true;
    }

    // 初始化GStreamer前设置环境变量以优化内存使用
    setenv("GST_DEBUG", "2", 1);     // 其他模块2
    // setenv("GST_DEBUG", "2,rtsp*:6", 1);     // 其他模块2，rtsp相关详细6
    setenv("GST_GL_MALLOC_HEURISTIC", "1", 1); // 优化GL内存分配
    setenv("GST_REGISTRY_UPDATE", "no", 1);    // 避免注册表更新

    // 限制GStreamer线程池大小，适应嵌入式设备
    g_setenv("GST_THREAD_POOL_MAX", "2", TRUE);

    // 减少GStreamer内存分配
    g_setenv("GST_BUFFER_POOL_MAX_SIZE", "8", TRUE);

    gst_init(nullptr, nullptr);
    isInitialized_ = true;

    EL_INFO("gst started");
    return true;
}

void StreamGst::Stop()
{
    if (!isInitialized_) {
        EL_INFO("gst already deinitialized or not initialized");
        return;
    }

    gst_deinit();
    isInitialized_ = false;
    EL_INFO("gst stopped");
}

} // namespace StreamService
} // namespace El